static void
correct_cache_insert (GtkText* text, gint nchars)
{
- GList* cache = text->current_line->next;
+ GList *cache;
+ GtkPropertyMark *start;
+ GtkPropertyMark *end;
+
+ /* If we split a property exactly at the beginning of the
+ * line, we have to correct here, or fetch_lines will
+ * fetch junk.
+ */
+
+ start = &CACHE_DATA(text->current_line).start;
+ if (start->offset == MARK_CURRENT_PROPERTY (start)->length)
+ SET_PROPERTY_MARK (start, start->property->next, 0);
+
+ /* Now correct the offsets, and check for start or end marks that
+ * are after the point, yet point to a property before the point's
+ * property. This indicates that they are meant to point to the
+ * second half of a property we split in insert_text_property(), so
+ * we fix them up that way.
+ */
+ cache = text->current_line->next;
for (; cache; cache = cache->next)
{
- GtkPropertyMark *start = &CACHE_DATA(cache).start;
- GtkPropertyMark *end = &CACHE_DATA(cache).end;
+ start = &CACHE_DATA(cache).start;
+ end = &CACHE_DATA(cache).end;
if (LAST_INDEX (text, text->point) &&
start->index == text->point.index)
if (start->property == text->point.property)
move_mark_n(start, nchars);
else
- start->index += nchars;
+ {
+ if (start->property->next &&
+ (start->property->next->next == text->point.property))
+ {
+ g_assert (start->offset >= MARK_CURRENT_PROPERTY (start)->length);
+ start->offset -= MARK_CURRENT_PROPERTY (start)->length;
+ start->property = text->point.property;
+ }
+ start->index += nchars;
+ }
}
if (LAST_INDEX (text, text->point) &&
{
if (end->property == text->point.property)
move_mark_n(end, nchars);
- else
- end->index += nchars;
+ else
+ {
+ if (end->property->next &&
+ (end->property->next->next == text->point.property))
+ {
+ g_assert (end->offset >= MARK_CURRENT_PROPERTY (end)->length);
+ end->offset -= MARK_CURRENT_PROPERTY (end)->length;
+ end->property = text->point.property;
+ }
+ end->index += nchars;
+ }
}
/*TEXT_ASSERT_MARK(text, start, "start");*/
text_property_chunk = g_mem_chunk_new ("text property mem chunk",
sizeof(TextProperty),
1024*sizeof(TextProperty),
- G_ALLOC_ONLY);
+ G_ALLOC_AND_FREE);
}
prop = g_chunk_new(TextProperty, text_property_chunk);
}
else
{
+ /* The following will screw up the line_start cache,
+ * we'll fix it up in correct_cache_insert
+ */
+
/* In the middle of forward_prop, if properties are equal,
* just add to its length, else split it into two and splice
* in a new one. */